package com.simulador.server;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Clase que manejará la información de las bss de datos (en Strings y números, no Proteínas ni nada de eso)
 * @author p
 *
 */
public class DB {
	static ResultSet rs = null;
	static PreparedStatement pst = null;
	static Connection con = null;
	static String url = "jdbc:mysql://localhost:3306/simulador";
    static String user = "pablo";
    static String password = "+";
	
	
	
	
	/**
	 * Cierra la conexion con mySQL
	 */
	public static void cerrar(){
		try {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            if (con != null) {
                con.close();
            }

        } catch (SQLException ex) {
            Logger lgr = Logger.getLogger(DB.class.getName());
            lgr.log(Level.WARNING, ex.getMessage(), ex);
        }
	}
	
	/**
	 * Constructor
	 * No creo que se requiera un constructor
	 */
	public DB(){
		
	}

	/**
	 * Obtiene los ID_universales de las proteínas rio abajo
	 * @param protID: la proteína desde la que se hará la busqueda
	 */
	public static ArrayList<String> getRioAbajo(String  protID) {
		ArrayList<String> lista= new ArrayList<String>();
		
        try {
            con = DriverManager.getConnection(url, user, password);
            pst = con.prepareStatement("SELECT * FROM relaciones WHERE proteina1 = '"+protID+"'");
            rs = pst.executeQuery();

	        while (rs.next()) {
	        	lista.add(rs.getString(2));
	        }
        }
        catch (SQLException ex) {
            Logger lgr = Logger.getLogger(DB.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);

        }
        cerrar();
		
		return lista;
	}
	
	/**
	 * Obtiene los ID_universales de las proteínas rio arriba
	 * @param protID: la proteína desde la que se hará la busqueda
	 */
	public static ArrayList<String> getRioArriba(String  protID) {
		ArrayList<String> lista= new ArrayList<String>();
		
		try {
            con = DriverManager.getConnection(url, user, password);
            pst = con.prepareStatement("SELECT * FROM relaciones WHERE proteina2 = '"+protID+"'");
            rs = pst.executeQuery();

	        while (rs.next()) {
	        	lista.add(rs.getString(1));
	        }
        }
        catch (SQLException ex) {
            Logger lgr = Logger.getLogger(DB.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);

        }
        cerrar();
		return lista;
	}

	/**
	 * Busca si se tiene en la base de datos una proteína por su ID
	 * @param protID: el ID universal de la proteína
	 * @return
	 */
	public static boolean buscar(String protID) {
		boolean res = false;
		try {
            con = DriverManager.getConnection(url, user, password);
            pst = con.prepareStatement("SELECT * FROM proteinas WHERE ID_universal = '"+protID+"'");
            rs = pst.executeQuery();

	        while (rs.next()) {
	        	if(protID.equalsIgnoreCase(rs.getString(1))){
	        		res = true;
	        	}
	        }
        }
        catch (SQLException ex) {
            Logger lgr = Logger.getLogger(DB.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);

        }
        cerrar();
		return res;
	}

	/**
	 * Obtiene el nombre común de la proteína
	 * @param protID
	 * @return
	 */
	public static String getNombre(String protID) {
		String res = "ERROR, no se encontro ese IDu"; //O cachar la excepcion?
		try {
            con = DriverManager.getConnection(url, user, password);
            pst = con.prepareStatement("SELECT * FROM proteinas WHERE ID_universal = '"+protID+"'");
            rs = pst.executeQuery();

	        if (rs.next()) {
	        	res  = rs.getString(2);
	        }
        }
        catch (SQLException ex) {
            Logger lgr = Logger.getLogger(DB.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);

        }
        cerrar();		
        return res;
	}
	
	/**
	 * Obtiene el nombre del organismo al que pertenece la proteína
	 * @param protID
	 * @return
	 */
	public static String getOrganismo(String protID) {
		String res = "ERROR, no se encontro ese ID_u";
		try {
            con = DriverManager.getConnection(url, user, password);
            pst = con.prepareStatement("SELECT * FROM proteinas WHERE ID_universal = '"+protID+"'");
            rs = pst.executeQuery();

	        if (rs.next()) {
	        	res = rs.getString(3);
	        	}
        }
        catch (SQLException ex) {
            Logger lgr = Logger.getLogger(DB.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);

        }
        cerrar();
		return res;
	}

	/**
	 * Obtiene la lista de ubicaciones posibles (Tabla no creada aún)
	 * @param protID
	 * @return
	 */
	public static ArrayList<String> getUbicaciones(String protID) {
		ArrayList<String> lista= new ArrayList<String>();
		try {
            con = DriverManager.getConnection(url, user, password);
            pst = con.prepareStatement("SELECT * FROM ubicaciones WHERE ID_universal = '"+protID+"'");
            rs = pst.executeQuery();

	        while (rs.next()) {
	        	lista.add(rs.getString(2));
	        }
        }
        catch (SQLException ex) {
            Logger lgr = Logger.getLogger(DB.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);

        }
        cerrar();
		return lista;
	}

	/**
	 * Obtien un hash con las modificaciones postraducionales (Tabla no creada aún)
	 * @param protID
	 * @return
	 */
	public static HashMap<String, Boolean> getModPos(String protID) {
		HashMap<String, Boolean> lista= new HashMap<String, Boolean>();
		try {
            con = DriverManager.getConnection(url, user, password);
            pst = con.prepareStatement("SELECT * FROM modPos WHERE ID_universal = '"+protID+"'");
            rs = pst.executeQuery();

	        while (rs.next()) {
	        	lista.put(rs.getString(2), new Boolean(rs.getBoolean(3)));
	        }
        }
        catch (SQLException ex) {
            Logger lgr = Logger.getLogger(DB.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);

        }
        cerrar();
		return lista;
	}

	/**
	 * Crea la lista de acciones (Tabla no creada aún)
	 * @param protID
	 * @return
	 */
	public static ArrayList<Accion> getAcciones(String protID) {
		ArrayList<Accion> lista= new ArrayList<Accion>();
		try {
            con = DriverManager.getConnection(url, user, password);
            pst = con.prepareStatement("SELECT * FROM ubicaciones WHERE ID_universal = '"+protID+"'");
            rs = pst.executeQuery();

	        while (rs.next()) {
	        	lista.add(new Accion(rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), new Boolean(rs.getString(6))));
	        }
        }
        catch (SQLException ex) {
            Logger lgr = Logger.getLogger(DB.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);

        }
        cerrar();
		return lista;
	}

	
	
	
	
	
	/////////////////////////
	public static void main(String[] args){
		System.out.println(getOrganismo("YDR480W"));
	}
	 

}
